package net.servir.capacidades.web.controller;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.Estados;
import net.servir.capacidades.model.Etapa;
import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.PuestoTipo;
import net.servir.capacidades.model.Regimen;
import net.servir.capacidades.model.Responsable;
import net.servir.capacidades.model.ServicioCivilBusqueda;
import net.servir.capacidades.model.Sistema;
import net.servir.capacidades.model.SistemaEtapa;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.jsp.JspResponsableEdicion;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.CensoService;
import net.servir.capacidades.service.MantenimientoService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ServicioCivilBusquedaController {

	@Autowired 
	private CapacidadesService capacidadesService;
	
	@Autowired 
	private MantenimientoService mantenimientoService;
	
	@Autowired 
	private CensoService censoService;
	
	@RequestMapping("/servicioCivilBusqueda.htm")
	public @ModelAttribute("servicioCivilBusqueda")
	
	ServicioCivilBusqueda censo(HttpServletRequest request) throws Exception {
		
		ServicioCivilBusqueda obj = new ServicioCivilBusqueda();
		//************************************************************
		// se obtiene el dni de la session activa
		//************************************************************
		HttpSession session = request.getSession();
		String cod_session =session.getId();

		String dniUsuario = null;
		if(session.getAttribute("dni") != null)			
			dniUsuario = session.getAttribute("dni").toString();
		
		//Obtenemos los datos del responsable
		Usuario usuario = null;
		if(session.getAttribute("usuario") != null)			
			usuario = (Usuario)session.getAttribute("usuario");
		
		if (usuario == null)
			throw new Exception("No se ha identificado al usuario");
		
		obj.setUsuario(usuario);				
		
		//************************************************************
		
		session.setAttribute("OBJ_RESP_BUSQ", null);
		session.setAttribute("OBJ_PARTIC_BUSQ", null);
		
				
		String coddep = null;
		String codpro = null;
		String coddis = null;
		String accion = null;
		String conAmbito = "0";
		String codEstadosOperador = null;
		String codEstadosResponsable = null;
		//String codPerfil = null;
		Number idPuestoTipo = null;
		String fecRegistro = "";
		String fecValidacion = "";
		Boolean conCriteriosBusqueda = false;
		Integer idNivelGobierno = 0;
		Integer idEjecutora = null;
		Integer idSector = null;
		Integer idSistema = 10;
		Integer idAmbito = 15;
		Integer idServicioCivil = null;
		//Se agrega filtro para funciones personalizadas
		String filtroFuncionesPersonalizadas="";
		//variables nuevas (juank)
		String codRegimen ="0";
		String codProfesion ="0";
		String fecRegistroFin="";
		String fecValidacionFin="";
		String tieneTituloUniversitario = null;
		Number sistemaEtapa1 = null;
		Number sistemaEtapa2 = null;
		Number sistemaEtapa3 = null;
		
		// obtener valores del accion de usuario
		coddep = request.getParameter("coddep");
		codpro = request.getParameter("codpro");
		coddis = request.getParameter("coddis");
		codEstadosOperador = request.getParameter("codEstadosOperador");
		codEstadosResponsable = request.getParameter("codEstadosResponsable");
		//codPerfil = request.getParameter("codPerfil");
		if (request.getParameter("id_puesto_tipo_filtro") != null && !request.getParameter("id_puesto_tipo_filtro").equals(""))
			idPuestoTipo = Integer.parseInt(request.getParameter("id_puesto_tipo_filtro"));
		
		/* @26022013 Arson
		 * Se añade filtro para funcion
		 */
		obj.setIdFuncion("0");
		obj.setFiltroIncluirFuncion("0");
		if (request.getParameter("idFuncion") != null && !request.getParameter("idFuncion").equals(""))
			obj.setIdFuncion(request.getParameter("idFuncion"));
		if (request.getParameter("filtroIncluirFuncion") != null && !request.getParameter("filtroIncluirFuncion").equals(""))
			obj.setFiltroIncluirFuncion(request.getParameter("filtroIncluirFuncion"));
		//Se agrega filtro para funciones personalizadas
		obj.setFiltroFuncionesPersonalizadas("0");
		if (request.getParameter("vc") != null && !request.getParameter("vc").equals(""))
			obj.setVc(request.getParameter("vc"));
		
		accion = request.getParameter("accion");
		String procedencia = ""; 
		String estado_equipo = "";
		Boolean adCorreo = false; 
		Boolean adParticipante = false;
		Boolean valParticipante = false;
		ServicioCivilBusqueda objPrevio = null;
		
		// Ver de donde procede el llamado a la pagina
		if (request.getParameter("procedencia") != null)
			procedencia  = request.getParameter("procedencia");
		
		if (accion!= null && accion.equals("ADICIONAR_CORREO"))
		{
			procedencia = "SC_EDICION";
			adCorreo = true;
			accion = "BUSCAR";
		}
		
		if (accion!= null && accion.equals("ADICIONAR_PARTICIPANTE"))
		{
			procedencia = "RESP_EDICION";
			adParticipante = true;
			accion = "BUSCAR";
		}
		
		if (accion!= null && accion.equals("VALIDAR_PARTICIPANTE"))
		{
			procedencia = "RESP_EDICION";
			valParticipante = true;
			accion = "BUSCAR";
		}
		
		if (!procedencia.equals("SC_EDICION"))
		{	
			
		/*================================
		 * llenando los combos profesiones y regimenes
		 *================================ 
		*/
		LinkedList<Profesion> profesions = capacidadesService.ObtenerProfesion();
		LinkedList<Regimen> regimens = capacidadesService.ObtenerRegimen();
		
		
		obj.setRegimens(regimens);
		obj.setProfesions(profesions);
		obj.setOptEstadosOperadores(capacidadesService.ObtenerEstadosOperadores());
		obj.setOptEstadosResponsable(capacidadesService.ObtenerEstadosResponsable());

		
		List<Estados> estado_equipos = new LinkedList<Estados>();
		Estados estado_equipo_ele = new Estados();
		estado_equipo_ele.setEstado("Sin acceso");
		estado_equipo_ele.setCod_estado("0");
		estado_equipos.add(estado_equipo_ele);
		estado_equipo_ele = new Estados();
		estado_equipo_ele.setEstado("Con acceso");
		estado_equipo_ele.setCod_estado("1");
		estado_equipos.add(estado_equipo_ele);
		
		obj.setEstado_equipos(estado_equipos);
		
		//obj.setOptPerfiles(capacidadesService.ObtenerPerfiles());
		
		if (accion != null)
			if (accion.equals("RETORNO"))
				accion = null;
	
		if (accion != null && !accion.equals(""))
		{
			if (request.getParameter("idNivelGobierno") != null)
				idNivelGobierno = Integer.parseInt(request.getParameter("idNivelGobierno").toString());
			if (request.getParameter("idServicioCivil") != null & !request.getParameter("idServicioCivil").equals(""))
				idServicioCivil = Integer.parseInt(request.getParameter("idServicioCivil").toString());
			if (request.getParameter("codRegimen") != null && !request.getParameter("codRegimen").trim().equals(""))
				codRegimen = request.getParameter("codRegimen");
			if (request.getParameter("codProfesion") != null && !request.getParameter("codProfesion").trim().equals(""))
				codProfesion = request.getParameter("codProfesion");
			if (request.getParameter("fecRegistro") != null && !request.getParameter("fecRegistro").trim().equals(""))
				fecRegistro= request.getParameter("fecRegistro");
			if (request.getParameter("fecValidacion") != null && !request.getParameter("fecValidacion").trim().equals(""))
				fecValidacion= request.getParameter("fecValidacion");
			if (request.getParameter("fecRegistroFin") != null && !request.getParameter("fecRegistroFin").trim().equals(""))
				fecRegistroFin= request.getParameter("fecRegistroFin");
			if (request.getParameter("fecValidacionFin") != null && !request.getParameter("fecValidacionFin").trim().equals(""))
				fecValidacionFin= request.getParameter("fecValidacionFin");
			if (request.getParameter("estado_equipo") != null && !request.getParameter("estado_equipo").trim().equals(""))
				estado_equipo = request.getParameter("estado_equipo");
			//Se agrega filtro con funciones personalizadas
			if (request.getParameter("isFuncionesPersonalizadas") != null && !request.getParameter("isFuncionesPersonalizadas").equals(""))
				filtroFuncionesPersonalizadas=request.getParameter("isFuncionesPersonalizadas");
			if (request.getParameter("filtroAsignadoPrueba") != null && !request.getParameter("filtroAsignadoPrueba").trim().equals("")){
				obj.setFiltroAsignadoPrueba(request.getParameter("filtroAsignadoPrueba"));
			}else{
				obj.setFiltroAsignadoPrueba("0");
			}
			if (idNivelGobierno == 2)
				obj.setSectores(capacidadesService.ObtenerSectors());
			if (request.getParameter("idSector") != null)
			{	
				if (!(request.getParameter("idSector").equals("")))
				{	
					idSector = Integer.parseInt(request.getParameter("idSector").toString());
					if (idSector != 0)
					{
						obj.setIdSector(idSector);
						// obj.setPliegos(censoService.obtenerPliegos(idSector));
					}
				}
			}		
			
			/*
			if (accion.equals("REFRESCARSEC"))
			{
				obj.setIdPliego(0);
				idPliego = null;
			}
			else if (request.getParameter("idPliego") != null & idSector != null)
			{	
				if (!(request.getParameter("idPliego").equals("")) & idSector != 0)
				{
					idPliego = Integer.parseInt(request.getParameter("idPliego").toString());
					obj.setIdPliego(idPliego);
				}
			}
			 */
			
			String ubigeo = "";
			if (coddep != null && !coddep.equals("0"))
				ubigeo = coddep;
			if (codpro != null && !codpro.equals("0"))
				ubigeo += codpro;
			if (coddis != null && !coddis.equals("0"))
				ubigeo += coddis;
				
			
			if (request.getParameter("idEjecutora") != null & idNivelGobierno != null ) //& idPliego != null
			{
				if (!(request.getParameter("idEjecutora").equals("")) ) // & idPliego != 0
				{	
					idEjecutora = Integer.parseInt(request.getParameter("idEjecutora").toString());
					obj.setIdEjecutora(idEjecutora);
					obj.setEjecutoras(capacidadesService.ObtenerEjecutorasNivelGobierno(idNivelGobierno,ubigeo,idSector));
				}
			}
			obj.setCoddep(coddep);
			
			if (coddep != null)
			{
				if (!coddep.equals("0"))
				{
					obj.setCoddep(coddep);
					obj.setProvincias(capacidadesService.ObtenerProvincias(coddep));
				}
			}
			
			if (accion.equals("REFRESCARDEP"))
			{
				obj.setCodpro("0");
				codpro = null;
			}

			if (codpro != null )
			{	
				obj.setCodpro(codpro);
				if (!codpro.equals("") & !(codpro .equals("0")))
				{
					obj.setDistritos(capacidadesService.ObtenerDistritos(coddep, codpro));
				}
			}
			
			if (request.getParameter("tieneTituloUniversitario") != null && !request.getParameter("tieneTituloUniversitario").trim().equals(""))
				tieneTituloUniversitario = request.getParameter("tieneTituloUniversitario");
			
			if (request.getParameter("id_sistema_etapa") != null && !request.getParameter("id_sistema_etapa").equals(""))
				obj.setId_sistema_etapa(Integer.parseInt(request
						.getParameter("id_sistema_etapa")));
			if (request.getParameter("sistemaEtapa1") != null)
				sistemaEtapa1 = Integer.parseInt(request.getParameter("sistemaEtapa1"));
			if (request.getParameter("sistemaEtapa2") != null)
				sistemaEtapa2 = Integer.parseInt(request.getParameter("sistemaEtapa2"));
			if (request.getParameter("sistemaEtapa3") != null)
				sistemaEtapa3 = Integer.parseInt(request.getParameter("sistemaEtapa3"));
		}
		else
			obj.setAccion("REFRESCAR");
		
		obj.setTieneTituloUniversitario(tieneTituloUniversitario);
		LinkedList<SistemaEtapa> listaSistemaEtapa = capacidadesService
				.ObtenerSistemaEtapa((Number)idAmbito);
		obj.setSistemaEtapa(listaSistemaEtapa);
		obj.setSistemaEtapa1(sistemaEtapa1);
		obj.setSistemaEtapa2(sistemaEtapa2);
		obj.setSistemaEtapa3(sistemaEtapa3);
		
		obj.setIdNivelGobierno(idNivelGobierno);
		obj.setNivelGobiernos(capacidadesService.ObtenerNivelGobiernos());
		obj.setDepartamentos(capacidadesService.ObtenerDepartamentos());
		obj.setCodRegimen(codRegimen);
		obj.setCodProfesion(codProfesion);
		obj.setEstado_equipo(estado_equipo);
		//Se agrega filtro con funciones personalizadas
		obj.setFiltroFuncionesPersonalizadas(filtroFuncionesPersonalizadas);
		if (idNivelGobierno == 2)
			obj.setSectors(capacidadesService.ObtenerSectors());

		obj.setSistemas(capacidadesService.ObtenerSistema());
		
		//idSistema = 0;
		obj.setIdSistema(idSistema);
		if (request.getParameter("idSistema") != null)
		{
			idSistema = Integer.parseInt(request.getParameter("idSistema"));
			obj.setIdSistema(idSistema);
		}
		obj.setIdAmbito(idAmbito);
		if (request.getParameter("idAmbito") != null && request.getParameter("idAmbito") != "")
		{
			idAmbito = Integer.parseInt(request.getParameter("idAmbito"));
			obj.setIdAmbito(idAmbito);
		}
		
		if (idSistema != 0)
		{
			Iterator itr = null;
			Sistema s = null;
			itr = obj.getSistemas().iterator();
			if (itr!= null)
			{
			Integer total_rows = obj.getSistemas().size();
			Integer row = 0; 
			while(itr.hasNext()){
				row += 1;
				s=(Sistema)itr.next();
				if (s.getId_sistema().intValue() == idSistema)
				{
					obj.setAmbitos(capacidadesService.ObtenerAmbito(idSistema));
					if (s.getCon_ambitos().equals("1"))
					{
						conAmbito = "1";
					}
					else
					{
						idAmbito = obj.getAmbitos().getFirst().getId_ambito().intValue();
						obj.setIdAmbito(idAmbito);
					}

				}
			}
			}
		}
		obj.setConAmbito(conAmbito);
		
		/* @26022013 Arson
		 * Se añade combo de funciones. Falta definir de donde se obtiene el ambito para poder filtrar por defecto 
		 */
		//System.out.println("idAmbito : "+idAmbito);

		List<Etapa> etapas = capacidadesService.ObtenerFuncionesOrdenadas(idAmbito);
		obj.setEtapas(etapas);
		//System.out.println(etapas);
		//Recuperamos la lista de Puestos Tipo
		List<PuestoTipo> optPuestoTipo =  mantenimientoService.getPuestoTiposOperadores(idSistema);
		obj.setOptPuestoTipo(optPuestoTipo);
		
		
		// set valores de los controles
		
		if (accion!= null)
		{	
			String nombres = (String) request.getParameter("nombres");
			if (nombres != null)
				obj.setNombres(nombres.toUpperCase().trim());
			String apellidosPaterno = (String) request.getParameter("apellidosPaterno");
			if (apellidosPaterno != null)
			obj.setApellidos_paterno(apellidosPaterno.toUpperCase().trim());
			String apellidosMaterno = (String) request.getParameter("apellidosMaterno");
			if (apellidosMaterno != null)
				obj.setApellidos_materno(apellidosMaterno.toUpperCase().trim());
			String dni = (String) request.getParameter("dni");
			if (dni!= null)
				obj.setDni(dni.trim());
			if (coddep != null)
				obj.setCoddep(coddep);
			if (codpro != null)
				obj.setCodpro(codpro);
			if (coddis != null)
				obj.setCoddis(coddis);
			String correo = "";
			if ((String) request.getParameter("correo") != null)
				correo =(String) request.getParameter("correo");
			obj.setCorreo(correo.toUpperCase());
			obj.setCodRegimen(codRegimen);
			obj.setCodProfesion(codProfesion);
			obj.setFecRegistro(fecRegistro);
			obj.setFecValidacion(fecValidacion);
			obj.setFecRegistroFin(fecRegistroFin);
			obj.setFecValidacionFin(fecValidacionFin);
		}
		
		//if (codPerfil != null && !codPerfil.equals(""))
		//	obj.setCodPerfil(codPerfil);
		obj.setId_puesto_tipo(idPuestoTipo);
		
		obj.setMensaje("");
		codEstadosOperador = (String) request.getParameter("codEstadosOperador"); 
		codEstadosResponsable = (String) request.getParameter("codEstadosResponsable"); 
		
		obj.setEstadoRegistro(codEstadosOperador);
		obj.setEstadoResponsable(codEstadosResponsable);
		obj.setAccion(accion );

		if (accion != null)
		{	
			if (!accion.equals("BUSCAR"))
				objPrevio = (ServicioCivilBusqueda)session.getAttribute("OBJ_SC_BUSQ");
			if (accion.equals("BUSCAR"))
				session.setAttribute("OBJ_SC_BUSQ", obj);
		}

		if (accion != null)
			if (accion.equals("DEL"))
			{
				JspResponsableEdicion jspResponsableEdicion  = new JspResponsableEdicion();
				Responsable responsable = new Responsable();
				responsable.setId_responsable(idServicioCivil);
				jspResponsableEdicion.setResponsable(responsable);
				jspResponsableEdicion.setId_ambito(idAmbito);
				capacidadesService.EliminarParticipante(jspResponsableEdicion);
				accion = "BUSCAR";
			}	
		}
		else
		{
			obj = (ServicioCivilBusqueda)session.getAttribute("OBJ_SC_BUSQ");
			codEstadosOperador = obj.getEstadoRegistro();
			codEstadosResponsable = obj.getEstadoResponsable();
			accion = obj.getAccion();
		}

		// Ejecutar busqueda
		List  RptResponsables = null;
		String vSql = "";
//		System.out.println("accion : "+accion);
		if (accion != null)
		if (accion.equals("BUSCAR"))
		{
			ServicioCivilBusqueda criterios = obj;
			vSql = censoService.obtenerRptQueryServicioCivil(obj); 
			RptResponsables = censoService.obtenerServicioCivilBusqueda(vSql);
			session.setAttribute("QUERY", vSql);
		}
		else
		{
			if (objPrevio != null)
			{
				vSql = censoService.obtenerRptQueryServicioCivil(objPrevio);
				RptResponsables = censoService.obtenerServicioCivilBusqueda(vSql);
			}
		}	
//		System.out.println("vSql : "+vSql);
		if  (RptResponsables == null & accion == null)
		{
			/*
			RptResponsables = capacidadesService.ObtenerServicioCivilBusqueda(obj,codEstadosOperador);
			vSql = capacidadesService.ObtenerRptQueryServicioCivil(obj, codEstadosOperador);
			session.setAttribute("OBJ_SC_BUSQ", obj);
			session.setAttribute("QUERY", vSql);
			if(obj.getMensaje().equals("")){
				if (RptResponsables == null)
					obj.setMensaje("Sin resultados para mostrar.");
				if (RptResponsables != null && RptResponsables.size() == 0)
					obj.setMensaje("Ninguna coincidencia para los filtros seleccionados.");
				if (RptResponsables != null && RptResponsables.size() > 0)
					obj.setMensaje("Total " + RptResponsables.size() + " coincidencia para los filtros seleccionados.");
			}
			obj.setEstadoRegistro("REGI");
			*/
		}
			if(obj.getMensaje().equals("")){
				if (RptResponsables == null)
					obj.setMensaje("Sin resultados para mostrar.");
				if (RptResponsables != null && RptResponsables.size() == 0)
					obj.setMensaje("Ninguna coincidencia para los filtros seleccionados.");
				if (RptResponsables != null && RptResponsables.size() > 0)
					obj.setMensaje("Total " + RptResponsables.size() + " coincidencia para los filtros seleccionados.");
			}
		request.setAttribute("DATALIST", RptResponsables);
		obj.setAccion("BUSCAR");
		String verNoHablitados = "";
		
		if (RptResponsables != null)
		{
			if (RptResponsables.size() > 0)
				obj.setConResultado("1");
			else
				obj.setConResultado("0");
		}
		else
		{
			obj.setConResultado("0");
		}
		
		if (codEstadosOperador != null)
			obj.setCodEstadosOperador(codEstadosOperador);
		else
			obj.setCodEstadosOperador("0");
		
		//estadoRegistro ="1";
		//obj.setAccion("REPORTAR");
		Number total;
		if (adCorreo)
		{
			capacidadesService.cargarResultadosBusqueda(vSql, dniUsuario,1);
			obj.setMensaje("Total "+RptResponsables.size()+ " operadores cargados como destinarios de correo masivo.");
		}
		// ADICIONA PARTICIPANTE
		if (adParticipante)
		{
//			System.out.println("adParticipante : "+dniUsuario);
			total = capacidadesService.cargarResultadosBusqueda(vSql, dniUsuario, 2);
			//obj.setMensaje("Total "+RptResponsables.size()+ " personas cargados para participantes de pruebas de diagnóstico.");
			obj.setMensaje("Total "+total+ " personas cargados para participantes de pruebas de diagnóstico.");
		}
		// ADICIONA PARTICIPANTE
		if (valParticipante)
		{
			total = capacidadesService.validacionMasiva(vSql);
			RptResponsables = censoService.obtenerServicioCivilBusqueda(vSql);
			session.setAttribute("QUERY", vSql);
			request.setAttribute("DATALIST", RptResponsables);
			//obj.setMensaje("Total "+RptResponsables.size()+ " personas cargados para participantes de pruebas de diagnóstico.");
			obj.setMensaje("Total "+total+ " personas validadas.");
		}
		//System.out.println("vSql : "+vSql);
		Integer idPerfil = 2;
		if (session.getAttribute("perfil") !=  null)
			idPerfil = (Integer) session.getAttribute("perfil");
		obj.setIdPerfil(idPerfil);
		
		obj.setUsuario(usuario);	
		return obj;
	}
}
